package com.tech.service;

import java.util.List;
import org.apache.ibatis.annotations.Param;

/**
* @Title IService.java
* @Description 通用Service接口  
* @author zlb
* @date 2018年11月9日 上午11:36:56
* @version V1.0
*/
public interface IService<T> {

    /**   
     * @Title: selectByPrimaryKey
     * @Description: 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号   
     * @param key 主键，对应实体中必须包含@Id
     * @return: T
     */
    T selectByPrimaryKey(Object key);
    
    
    /**   
     * @Title: selectOne   
     * @Description: 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     * @param record
     * @return: T      
     */
    T selectOne(T record);
    
    
    /**   
     * @Title: select
     * @Description: 根据实体中的属性值进行查询，查询条件使用等号
     * @return: List<T>
     */
    List<T> select(T record);
    
    
    /**   
     * @Title: selectByExample
     * @Description: 根据Example条件进行查询,这个查询支持通过Example类指定查询列，通过selectProperties方法指定查询列
     * @return: List<T>
     */
    List<T> selectByExample(Object example);
    
    
    /**   
     * @Title: selectCount
     * @Description: 根据实体中的属性查询总数，查询条件使用等号
     * @return: int
     */
    int selectCount(T record);
    
    
    /**   
     * @Title: selectCountByExample
     * @Description: 根据Example条件进行查询总数
     * @throws
     */
    int selectCountByExample(Object example);
    
    
    /**   
     * @Title: selectAll
     * @Description: 查询全部结果，select(null)方法能达到同样的效果
     * @return: List<T>
     */
    List<T> selectAll();
    

    /**   
     * @Title: insert
     * @Description: 保存一个实体，null的属性也会保存，不会使用数据库默认值
     * @return: int
     */
    int insert(T entity);
    
    
    /**   
     * @Title: insertSelective
     * @Description: 保存一个实体，null的属性不会保存，会使用数据库默认值
     * @return: int
     */
    int insertSelective(T record);
    
    
    /**   
     * @Title: updateByPrimaryKey
     * @Description: 根据主键更新实体全部字段，null值会被更新
     * @return: int
     * @throws
     */
    int updateByPrimaryKey(T record);
    
    /**   
     * @Title: updateByPrimaryKeySelective
     * @Description: 根据主键更新属性不为null的值
     * @return: int
     * @throws
     */
    int updateByPrimaryKeySelective(T record);
    
    
    /**   
     * @Title: updateByExample
     * @Description: 根据Example条件更新实体record包含的全部属性，null值会被更新
     * @return: int
     */
    int updateByExample(@Param("record") T record, @Param("example") Object example);
    
    
    /**   
     * @Title: updateByExampleSelective
     * @Description: 根据Example条件更新实体record包含的不是null的属性值
     * @return: int
     */
    int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
    

    /**   
     * @Title: delete
     * @Description: 根据实体属性作为条件进行删除，查询条件使用等号
     * @return: int
     * @throws
     */
    int delete(T record);

    /**   
     * @Title: deleteByPrimaryKey
     * @Description: 根据主键字段进行删除，方法参数必须包含完整的主键属性
     * @return: int
     */
    int deleteByPrimaryKey(Object key);

    /**   
     * @Title: deleteByExample
     * @Description: 根据Example条件删除数据
     * @return: int
     */
    int deleteByExample(Object example);

    
    /**
    * @Title selectByExampleByPage
    * @Description 根据分页信息进行结果返回
    * @param clazz 实体类
    * @param pageNum 页码
    * @param pageSize 每一页大小
    * @return
    * {@link }
    * @since 2018年11月25日 上午11:36:55
    */
    List<T> selectByExampleByPage(Class<?> clazz,int pageNum,int pageSize);
}
